package com.zhu.tool_test.starke.framework.redis.event;

import lombok.Data;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * @author  4everlynn
 * @version V1.0
 * @description 事件触发器
 * @date 2019-04-16
 */
@Data
public class EventMethodInvoker {
    /**
     * 事件处理方法
     */
    private Method method;
    /**
     * 事件处理对象
     */
    private Object runner;

    /**
     * 执行监听层方法
     *
     * @param args 方法需要的参数
     */
    public void invoke(Object... args) {
        try {
            Parameter[] parameters = method.getParameters();
            boolean invokeWithParam = true;
            if (parameters.length != args.length) {
                invokeWithParam = false;
            } else {
                // 对比
                for (int i = 0; i < parameters.length; i++) {
                    Parameter parameter = parameters[i];
                    // 有一个参数不符合就不带参数
                    // TODO 当参数类型全部一致，但是顺序不一致的时候也需要带上
                    //  此功能暂不做实现(当前需求用不上) 等待有缘人完善
                    if (!parameter.getType().isAssignableFrom(args[i].getClass())) {
                        invokeWithParam = false;
                        break;
                    }
                }
            }
            if (invokeWithParam) {
                method.invoke(runner, args);
            } else {
                method.invoke(runner);
            }
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
